package com.wf.netty.coder.integer;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

/**
 * 读取两个整数进行求和
 *
 * @author wf
 * @since 2022/5/26
 */
public class IntegerAddDecoder extends ReplayingDecoder<IntegerAddDecoder.PHASE> {
    //自定义的状态枚举值，代表两个阶段
    enum PHASE {
        PHASE_1,//第一个阶段，仅仅提取第一个整数，完成后进入第二个阶段
        PHASE_2 //第二个阶段，提取第二个整数后，还需要计算相加的结果并输出
    }

    private int first;
    private int second;

    public IntegerAddDecoder() {
        //在构造函数中，初始化父类的state属性为PHASE_1，表示第一个阶段
        super(PHASE.PHASE_1);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        //判断当前的状态
        switch (state()) {
            //第一个阶段，仅仅提取第一个整数，完成后进入第二个阶段
            case PHASE_1:
                //从装饰器ByteBuf 中读取数据
                first = in.readInt();
                //第一步解析成功，进入第二步，设置“state”为第二个阶段
                checkpoint(PHASE.PHASE_2);
                break;

            //提取第二个整数后还需要计算相加的结果
            //并将和作为解码的结果输出
            case PHASE_2:
                second = in.readInt();
                Integer sum = first + second;
                out.add(sum);
                //进入下一轮解码的第一步，设置“state”为第一个阶段
                checkpoint(PHASE.PHASE_1);
                break;
            default:
                break;
        }
    }
}